package graph

import "github.com/tidwall/btree"

// 直接将顶点/边信息保存到树的节点上
type Item struct {
	Key    string  `json:"key,omitempty"`    // 顶点或者边的名称
	Vertex *Vertex `json:"vertex,omitempty"` // 顶点
	Edge   *Edge   `json:"edge,omitempty"`   // 边
}

func ItemLess(a, b *Item) bool {
	return a.Key < b.Key
}

func NewItem(key string, vertex *Vertex, edge *Edge) *Item {
	return &Item{
		Key:    key,
		Vertex: vertex,
		Edge:   edge,
	}
}

// 有向图
type Digraph struct {
	Vertexes *btree.BTreeG[*Item] `json:"vertexes,omitempty"`
	Edges    *btree.BTreeG[*Item] `json:"edges,omitempty"`
}

// 顶点
type Vertex struct {
	In               *ConnectionPoint     `json:"in,omitempty"`
	Out              *ConnectionPoint     `json:"out,omitempty"`
	AdjacentVertexes *btree.BTreeG[*Item] `json:"adjacent_vertexes,omitempty"`
}

// 各顶点之间边的连接端点
type ConnectionPoint struct {
	Name string `json:"name,omitempty"`
}

// 有向边
type Edge struct {
	// 从一个顶点的Out端点出发
	From *ConnectionPoint `json:"from,omitempty"`
	// 到某个顶点的In端点
	To  *ConnectionPoint `json:"to,omitempty"`
	Api *Api             `json:"api,omitempty"`
}

// 每条有向边记录着相关API信息
type Api struct {
	// 边上API的数量
	Num int `json:"num,omitempty"`
	// 这些API总的调用计数
	CallCount int `json:"call_count,omitempty"`
	// 响应码统计，例如200:1、500:1
	ResponseCodes map[uint32]int `json:"response_codes,omitempty"`
}
